package cn.iocoder.yudao.module.pm.service.qcrecords;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.pm.controller.admin.qcrecords.vo.QcRecordsPageReqVO;
import cn.iocoder.yudao.module.pm.controller.admin.qcrecords.vo.QcRecordsSaveReqVO;
import cn.iocoder.yudao.module.pm.controller.app.qcrecords.vo.AppQcRecordsPageReqVO;
import cn.iocoder.yudao.module.pm.controller.app.qcrecords.vo.AppQcRecordsRespVO;
import cn.iocoder.yudao.module.pm.controller.app.qcrecords.vo.AppQcRecordsSaveReqVO;
import cn.iocoder.yudao.module.pm.dal.dataobject.qcrecords.QcRecordsDO;
import cn.iocoder.yudao.module.pm.dal.mysql.qcrecords.QcRecordsMapper;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
import static cn.iocoder.yudao.module.pm.enums.ErrorCodeConstants.QC_RECORDS_NOT_EXISTS;

/**
 * 过程管理-速冷处理记录 Service 实现类
 *
 * @author yisl
 */
@Service
@Validated
public class QcRecordsServiceImpl implements QcRecordsService {

    @Resource
    private QcRecordsMapper qcRecordsMapper;
    @Resource
    private AdminUserApi adminUserApi;

    @Override
    public Long createQcRecords(QcRecordsSaveReqVO createReqVO) {
        // 插入
        QcRecordsDO qcRecords = BeanUtils.toBean(createReqVO, QcRecordsDO.class);
        qcRecords.setBatchCode("A"+System.currentTimeMillis());
        qcRecordsMapper.insert(qcRecords);
        // 返回
        return qcRecords.getId();
    }

    @Override
    public void updateQcRecords(QcRecordsSaveReqVO updateReqVO) {
        // 校验存在
        validateQcRecordsExists(updateReqVO.getId());
        // 更新
        QcRecordsDO updateObj = BeanUtils.toBean(updateReqVO, QcRecordsDO.class);
        qcRecordsMapper.updateById(updateObj);
    }

    @Override
    public void deleteQcRecords(Long id) {
        // 校验存在
        validateQcRecordsExists(id);
        // 删除
        qcRecordsMapper.deleteById(id);
    }

    @Override
        public void deleteQcRecordsListByIds(List<Long> ids) {
        // 校验存在
        validateQcRecordsExists(ids);
        // 删除
        qcRecordsMapper.deleteByIds(ids);
        }

    private void validateQcRecordsExists(List<Long> ids) {
        List<QcRecordsDO> list = qcRecordsMapper.selectByIds(ids);
        if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
            throw exception(QC_RECORDS_NOT_EXISTS);
        }
    }

    private void validateQcRecordsExists(Long id) {
        if (qcRecordsMapper.selectById(id) == null) {
            throw exception(QC_RECORDS_NOT_EXISTS);
        }
    }

    @Override
    public QcRecordsDO getQcRecords(Long id) {
        return qcRecordsMapper.selectById(id);
    }

    @Override
    public PageResult<QcRecordsDO> getQcRecordsPage(QcRecordsPageReqVO pageReqVO) {
        return qcRecordsMapper.selectPage(pageReqVO);
    }

    @Override
    public Long appCreateQcRecords(AppQcRecordsSaveReqVO createReqVO) {
        // 插入
        QcRecordsDO qcRecords = BeanUtils.toBean(createReqVO, QcRecordsDO.class);
        qcRecords.setBatchCode("A"+System.currentTimeMillis());
        qcRecordsMapper.insert(qcRecords);
        // 返回
        return qcRecords.getId();
    }

    @Override
    public void appUpdateQcRecords(AppQcRecordsSaveReqVO updateReqVO) {
        // 校验存在
        validateQcRecordsExists(updateReqVO.getId());
        // 更新
        QcRecordsDO updateObj = BeanUtils.toBean(updateReqVO, QcRecordsDO.class);
        qcRecordsMapper.updateById(updateObj);
    }

    @Override
    public void appDeleteQcRecords(Long id) {
        // 校验存在
        validateQcRecordsExists(id);
        // 删除
        qcRecordsMapper.deleteById(id);
    }

    @Override
    public AppQcRecordsRespVO appGetQcRecords(Long id) {
        QcRecordsDO qcRecordsDO = qcRecordsMapper.selectById(id);
        AppQcRecordsRespVO respVO = BeanUtils.toBean(qcRecordsDO, AppQcRecordsRespVO.class);
        if (qcRecordsDO != null) {
            AdminUserRespDTO user = adminUserApi.getUser(NumberUtils.parseLong(qcRecordsDO.getCreator()));
            if (user != null) {
                respVO.setCreatorName(user.getNickname());
            }
        }
        return respVO;
    }

    @Override
    public PageResult<AppQcRecordsRespVO> appGetQcRecordsPage(AppQcRecordsPageReqVO pageReqVO) {
        PageResult<QcRecordsDO> thawRecordsDOPageResult = qcRecordsMapper.appSelectPage(pageReqVO);
        return new PageResult<>(buildThawRecordsDetailList(thawRecordsDOPageResult.getList()), thawRecordsDOPageResult.getTotal());
    }
    private List<AppQcRecordsRespVO> buildThawRecordsDetailList(List<QcRecordsDO> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        // 1 获取创建人列表
        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(list,
                contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getId())));
        // 2. 转换成 VO
        return BeanUtils.toBean(list, AppQcRecordsRespVO.class, clueVO -> {
            // 1. 设置创建人名称
            MapUtils.findAndThen(userMap, NumberUtils.parseLong(clueVO.getCreator()),
                    user -> clueVO.setCreatorName(user.getNickname()));
        });
    }

}